#
#  Copyright (c) 2016, The OpenThread Authors.
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#  3. Neither the name of the copyright holder nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.
#

include $(abs_top_nlbuild_autotools_dir)/automake/pre.am

#----------------------------------------
#
# This library on the face of it, appears to be identical
# for both the MTD and FTD variants, however ...
#
# The source code here includes numerous OpenThread internal headers.
# Due to the "domino-effect" other internal headers are included.
#
# For example:
#     cli.cpp includes:
#            src/core/common/instance.hpp
# Which Includes:
#            src/core/therad/thread_netif.hpp
# Which Includes:
#            src/core/meshcop/dataset_manager.hpp
# Which Includes:
#            src/core/threadnetwork_data_leader.hpp
#
# That header (and others) is either an MTD or FTD class flavor.
#
# The FTD flavor has many private components (class variables).
# The MTD flavor has no private components.
#
# Bottom line: The Class(structs) are thus different in the downstream
# libs. At this level (in the CLI, and likewise in the NCP) they are
# functionally identical.
#
# ORIGINALLY (historical note about how things are/where built):
#
#     The difference between MTD and FTD was a define..  -DOPENTHREAD_MTD
#     There was no "FTD" define, it is/was assumed that FTD is the default.
#
#     Historically this library -DOPENTHREAD_MTD was not defined/set.
#     (it is set via a commandline define in 'lib-openthread')
#
#     Thus, the existing(previous) way *THIS* library was compiled is
#     exactly the FTD path. Meaning the "cli" library always sees
#     the FTD varients of various headers/classes.
#
#     The same is true of the "ncp" library.
#
# HOWEVER there are two varients of the CLI application, CLI-MTD
# and CLI-FTD (and likewise, two varients of the ncp application)
# These applications link against two different OpenThread libraries.
#
# Which flavor, you get depends upon which library: "mtd" or "ftd" is linked.
#
# Which on the surface appear to link fine against the MTD/FTD library.
#
# In this description/example we focus on the  "nework_data_leader"
# header file. The FTD varient has many private variables, functions
# and other things of "FTD" (ie: full) implementation items.
#
# In contrast the MTD is generaly stubbed out with stub-functions
# inlined in the header that return "error not implemented" or similar.
#
# Thus it works... here ... With this file and this example.
#
# The unknown:
#    What about the other files?
#    What about the other c++ classes?
#    Is this true always? Is this robust?
#    Or is there a hidden "got-ya" that will snag the next person?
#
# This also fails static analisys, checks.
#    Application - with MTD vrs FTD class.
#    Library #1  (cli-lib) with FTD selected.
#    Library #2  (openthread) with two different class flavors.
#
# The static analisys tools will say: "NOPE" different classes!
# Perhaps this will change if/when nothing is implemented in the 'mtd-header'
#
# Additionally, tools that perform "whole program optimization" will
# throw errors becuase the data structures differ greatly.
#
# Hence, CLI library (and NCP) must exist in two flavors.
#
# Unless and until these libraries do not "accidently" suck in
# a "flavored" header file somewhere.

lib_LIBRARIES                       = $(NULL)

if OPENTHREAD_ENABLE_FTD
lib_LIBRARIES                      += libopenthread-cli-ftd.a
endif

if OPENTHREAD_ENABLE_MTD
lib_LIBRARIES                      += libopenthread-cli-mtd.a
endif

CPPFLAGS_COMMON =                     \
    -I$(top_srcdir)/include           \
    -I$(top_srcdir)/src               \
    -I$(top_srcdir)/src/core          \
    $(OPENTHREAD_TARGET_DEFINES)      \
    $(NULL)

if OPENTHREAD_POSIX
CPPFLAGS_COMMON +=                    \
    -DOPENTHREAD_POSIX=1              \
    $(NULL)
else
CPPFLAGS_COMMON +=                    \
    -DOPENTHREAD_POSIX=0              \
    $(NULL)
endif

libopenthread_cli_mtd_a_CPPFLAGS =    \
    -DOPENTHREAD_MTD=1                \
    -DOPENTHREAD_FTD=0                \
    -DOPENTHREAD_RADIO=0              \
    $(CPPFLAGS_COMMON)                \
    $(NULL)

libopenthread_cli_ftd_a_CPPFLAGS =    \
    -DOPENTHREAD_MTD=0                \
    -DOPENTHREAD_FTD=1                \
    -DOPENTHREAD_RADIO=0              \
    $(CPPFLAGS_COMMON)                \
    $(NULL)

SOURCES_COMMON =                      \
    cli.cpp                           \
    cli_coap.cpp                      \
    cli_coap_secure.cpp               \
    cli_commissioner.cpp              \
    cli_console.cpp                   \
    cli_dataset.cpp                   \
    cli_joiner.cpp                    \
    cli_network_data.cpp              \
    cli_srp_client.cpp                \
    cli_srp_server.cpp                \
    cli_uart.cpp                      \
    cli_udp.cpp                       \
    $(NULL)

libopenthread_cli_ftd_a_SOURCES =     \
    $(SOURCES_COMMON)                 \
    $(NULL)

libopenthread_cli_mtd_a_SOURCES =     \
    $(SOURCES_COMMON)                 \
    $(NULL)

noinst_HEADERS                      = \
    cli.hpp                           \
    cli_coap.hpp                      \
    cli_coap_secure.hpp               \
    cli_commissioner.hpp              \
    cli_config.h                      \
    cli_console.hpp                   \
    cli_dataset.hpp                   \
    cli_joiner.hpp                    \
    cli_network_data.hpp              \
    cli_srp_client.hpp                \
    cli_srp_server.hpp                \
    cli_uart.hpp                      \
    cli_udp.hpp                       \
    x509_cert_key.hpp                 \
    $(NULL)

if OPENTHREAD_BUILD_COVERAGE
CLEANFILES                          = $(wildcard *.gcda *.gcno)
endif # OPENTHREAD_BUILD_COVERAGE

include $(abs_top_nlbuild_autotools_dir)/automake/post.am
